/****************************************************************************
                Университет:    Санкт-Петербургский Политехнический Университет
                Кафедра:        Компьютерные системы и программные технологии
                Аспирант:       Быков Илья Иванович
                Программа:      Расчет коэффициентов распределения
                Модуль:         mainwindow.h
                Назначение:     Объявление класса MainWindow
****************************************************************************/

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QProcess>

#include "ui_mainwindow.h"
#include "modulemanifest.h"

class Document;

namespace Ui { class MainWindow; }

// Класс главного окна приложения
class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    enum EditingMode
    {
        Select,
        AddNode,
        AddEdge
    };
        
    MainWindow(QWidget *parent = 0);

    void addDocument(Document *doc);            // Используется в openDocument() и newDocument()
    void removeDocument(Document *doc);         // Используется в closeDocument()
    void setCurrentDocument(Document *doc);     // Устанавливает текущий документ. Используется в addDocument (Document *doc)
    Document *currentDocument() const;
    EditingMode editingMode() const;

    static MainWindow *instance();

public slots:
    void openDocument();                        // Открытие документа
    void saveDocument();                        // Сохранение документа
    void closeDocument();                       // Закрытие документа
    void newDocument();                         // Новый документ

    void EdgeDataRead(const QList<int>    &state,
                      const QList<double> &resist_R, const QList<double> &resist_X,
                      const QList<double> &power_a, const QList<double> &power_r, const QList<double> &otr_pow_a, const QList<double> &pol_pow_a);

    void NodeDataRead(const QList<int>    &state,
                      const QList<double> &voltage,
                      const QList<double> &a_p,
                      const QList<double> &r_p,
                      const QList<double> &max_Pa, const QList<double> &min_Pa);


    void EdgeDataWrite(QList<double> &resist_R, QList<double> &resist_X);

    void removeItem();                          // Удалить узел
    void setNodeColor();                        // Установить цвет узла

    void about();                               // О программе

    void on_actionAddNode_triggered(bool checked = false);
    void on_actionAddEdge_triggered(bool checked = false);

    void on_actionMatrixCircuit_triggered();
    void on_actionMatrixBranches_triggered();
    void on_actionMatrixPaths_triggered();
    void on_actionCommentMatrix_triggered();
    void on_actionFullReport_triggered();

    void updateActions();
    void setEnabledCharacters(bool b);

private slots:


    void on_action_node_settings_triggered();

    void on_action_edge_settings_triggered();

    void on_action_Run_triggered();

    void analysResults(int exitCode,QProcess::ExitStatus exitStatus);

    void on_modul_settings_action_triggered();

    void run(QAction* action);

    void on_action_open_report_triggered();

    void on_action_program_settings_triggered();

private:
    ModuleList modules();
    QString saveDocumentInTemporaryFile();
    QString TemporaryReportFile();

private:
    Ui::MainWindow *ui;

    QUndoGroup *m_undoGroup;

    QString fixedWindowTitle(const Document *doc) const;

    EditingMode m_editingMode;

    static MainWindow *g_mainWindow;

    ModuleList moduleList;

};


#endif // MAINWINDOW_H
